package com.ash;

import java.util.Iterator;
import java.util.ServiceLoader;

import com.ash.spi.ObjectSerializer;

/**
 * https://juejin.im/post/5b9b1c115188255c5e66d18c
 * <p>
 * 优点：
 * 使用Java SPI机制的优势是实现解耦，使得第三方服务模块的装配控制的逻辑与调用者的业务代码分离，而不是耦合在一起。应用程序可以根据实际业务情况启用框架扩展或替换框架组件。
 * 缺点：
 * 虽然ServiceLoader也算是使用的延迟加载，但是基本只能通过遍历全部获取，也就是接口的实现类全部加载并实例化一遍。如果你并不想用某些实现类，它也被加载并实例化了，这就造成了浪费。获取某个实现类的方式不够灵活，只能通过Iterator形式获取，不能根据某个参数来获取对应的实现类。
 * 多个并发多线程使用ServiceLoader类的实例是不安全的。
 *
 * @Author Ash
 */
public class Test {

    public static void main(String[] args) {
//        System.out.println("spi demo");
//        for (String s : System.getProperty("java.class.path").split(";")) {
//            System.out.println(s);
//        }

        ServiceLoader<ObjectSerializer> serializers = ServiceLoader.load(ObjectSerializer.class);

        Iterator<ObjectSerializer> iterator = serializers.iterator();
        while (iterator.hasNext()) {
            ObjectSerializer serializer = iterator.next();
            byte[] serialize = serializer.serialize("123");

            String s = serializer.deSerialize(serialize, String.class);

            System.out.println("反序列化后:" + s);

            System.out.println(serializer.getSchemeName());
        }

    }

}
